package com.example.day13;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.lang.ref.WeakReference;

public class MainActivity extends AppCompatActivity {
    TextView text;
    Button button;
    ImageView image;

    /**
     * 这种创建Handler的方式看上去没什么毛病但是会容易造成内存泄漏，
     * 由于mHandler是Handler的非静态匿名内部类的实例，所以它持有外部类Activity的引用，
     * 我们知道消息队列是在一个Looper线程中不断轮询处理消息，
     * 那么当这个Activity退出时消息队列中还有未处理的消息或者正在处理消息，
     * 而消息队列中的Message持有mHandler实例的引用，mHandler又持有Activity的引用，
     * 所以导致该Activity的内存资源无法及时回收，引发内存泄漏
     */

    Handler mHandler = new MyHandler(this) {

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = findViewById(R.id.text);
        button = findViewById(R.id.button1);
        image = findViewById(R.id.image1);
//        changetime1();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                changetime4();
//                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
//                startActivity(intent);
            }
        });
    }

    private void changetime1() {
        for (int i = 1; i <= 10; i++) {
            final int fadedSecond = 10 - i;
            //每延迟一秒，发送一个Runnable对象
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    text.setText(fadedSecond + "");
                }
            }, 1000 * i);
        }
    }

    public void changetime2() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 10; i++) {
                    try {
//                      Message message = new Message();
                        //从全局池中返回一个message实例，避免多次创建message（如new Message）
                        Message message = Message.obtain();
                        message.what = 100;
                        Thread.sleep(1000);
                        message.arg1 = 10 - i;
                        mHandler.sendMessage(message);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
    }

    public void changetime3() {
        Message message = Message.obtain();
        message.what=2000;
        new WorkThread(WorkThread.MAP, mHandler, message, "http://n.sinaimg.cn/news/1_img/dfic/3ad618a7/106/w1024h682/20190423/rx1V-hvvuiyn6453816.jpg", null).start();
    }
    public void changetime4() {
        Message message = Message.obtain();
        message.what=100;
        new WorkThread(WorkThread.STIRING, mHandler, message, "https://gitee.com/little_bird_oh_777/test_data_collection/raw/master/test42018061010.json", null).start();
    }
    /**
     * 我们知道Java中有垃圾回收机制GC,WeakReference弱引用是这么一个东西，
     * 在垃圾回收器线程扫描它所管辖的内存区域的过程中，一旦发现了只具有弱引用的对象，
     * 不管当前内存空间足够与否，都会回收它的内存。
     * 不过，由于垃圾回收器是一个优先级很低的线程，因此不一定会很快发现那些只具有弱引用的对象。
     */

    private static class MyHandler extends Handler {
        private WeakReference<Context> reference;   //

        public MyHandler(Context context) {
            reference = new WeakReference<>(context);//这里传入activity的上下文
        }

        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = (MainActivity) reference.get();
            super.handleMessage(msg);
            switch (msg.what) {      //判断标志位
                case 100:
                    activity.text.setText(msg.obj.toString());
                    break;
                case 2000:
                    activity.image.setImageBitmap((Bitmap) msg.obj);
                    break;
            }
        }
    }
}
